package com.xlkj.ms.tools.core.utils;

import java.math.BigDecimal;

/**
 * BigDecimal工具类
 * @author zhuqifeng
 * @date 2021/11/10 11:40
 * @package com.xlkj.ms.tools.core.utils
 */
public final class BigDecimalUtils {

    /**
     * 将字符串转换成BigDecimal
     * @param src
     * @return 如果src是空的，那么久返回BigDecimal.ZERO
     */
    public static BigDecimal stringToBigDecimal(String src) {
        if (StringUtils.isBlank(src)) {
            return BigDecimal.ZERO;
        }
        return new BigDecimal(src);
    }

    /**
     * 格式化
     *
     * @param bigDecimal
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:44
     */
    public static String formatDecimal(BigDecimal bigDecimal, int digit) {
        if (null == bigDecimal) {
            bigDecimal = new BigDecimal("0.00");
        }
        return bigDecimal.setScale(digit, BigDecimal.ROUND_DOWN).toString();
    }

    public static String formatString(String src, int digit) {
        BigDecimal bigDecimal = new BigDecimal("0.00");
        if (!StringUtils.isBlank(src)) {
            bigDecimal = new BigDecimal(src);
        }
        return bigDecimal.setScale(digit, BigDecimal.ROUND_DOWN).toString();
    }

    /**
     * arg1 - arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:56
     */
    public static String subtract(String arg1, String arg2, int digit) {
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal subtractResult = arg1BigDecimal.subtract(arg2BigDecimal).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(subtractResult, digit);
    }

    /**
     * arg1 - arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:56
     */
    public static String subtract(BigDecimal arg1, BigDecimal arg2, int digit) {
        BigDecimal subtractResult = arg1.subtract(arg2).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(subtractResult, digit);
    }

    /**
     * arg1 - arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:56
     */
    public static String subtract(BigDecimal arg1, String arg2, int digit) {
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal subtractResult = arg1.subtract(arg2BigDecimal).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(subtractResult, digit);
    }

    /**
     * arg1 - arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:56
     */
    public static String subtract(String arg1, BigDecimal arg2, int digit) {
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal subtractResult = arg1BigDecimal.subtract(arg2).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(subtractResult, digit);
    }

    /**
     * arg1 + arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:58
     */
    public static String add(String arg1, String arg2, int digit) {
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal addResult = arg1BigDecimal.add(arg2BigDecimal).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(addResult, digit);
    }

    /**
     * arg1 + arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:58
     */
    public static String add(BigDecimal arg1, BigDecimal arg2, int digit) {
        BigDecimal addResult = arg1.add(arg2).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(addResult, digit);
    }

    /**
     * arg1 + arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:58
     */
    public static String add(String arg1, BigDecimal arg2, int digit) {
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal addResult = arg1BigDecimal.add(arg2).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(addResult, digit);
    }

    /**
     * arg1 + arg2
     *
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:58
     */
    public static String add(BigDecimal arg1, String arg2, int digit) {
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal addResult = arg1.add(arg2BigDecimal).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(addResult, digit);
    }

    /**
     * arg1 + arg2
     *
     * @param digit
     * @param args
     * @return java.math.BigDecimal
     * @date 2019/6/26 16:58
     */
    public static String add(int digit, String... args) {
        BigDecimal addResult = BigDecimal.ZERO;
        for (String arg : args){
            BigDecimal argBigDecimal = stringToBigDecimal(arg);
            addResult = addResult.add(argBigDecimal).setScale(digit, BigDecimal.ROUND_DOWN);
        }
        return formatDecimal(addResult, digit);
    }

    /**
     * arg1 * arg2
     * @date 2019/6/26 17:02
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     */
    public static String multiply(String arg1, String arg2, int digit) {
        if(isZero(arg1) || isZero(arg2)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal multiplyResult = arg1BigDecimal.multiply(arg2BigDecimal).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * arg1 * arg2
     * @date 2019/6/26 17:02
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     */
    public static String multiply(BigDecimal arg1, BigDecimal arg2, int digit) {
        if(isZero(arg1) || isZero(arg2)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal multiplyResult = arg1.multiply(arg2).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * arg1 * arg2
     * @date 2019/6/26 17:02
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     */
    public static String multiply(BigDecimal arg1, String arg2, int digit) {
        if(isZero(arg1) || isZero(arg2)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal multiplyResult = arg1.multiply(arg2BigDecimal).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * arg1 * arg2
     * @date 2019/6/26 17:02
     * @param arg1
     * @param arg2
     * @param digit
     * @return java.math.BigDecimal
     */
    public static String multiply(String arg1, BigDecimal arg2, int digit) {
        if(isZero(arg1) || isZero(arg2)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal multiplyResult = arg1BigDecimal.multiply(arg2).setScale(digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * 如果是空字符串，或者BigDecimal.ZERO，都返回true
     * @param src
     * @return
     */
    public static boolean isZero(String src){
        return isZero(stringToBigDecimal(src));
    }

    private static boolean isZero(BigDecimal src){
        return null == src || 0 == src.compareTo(BigDecimal.ZERO);
    }

    /**
     * arg1 / arg2
     * @param arg1
     * @param arg2
     * @param digit
     * @return
     */
    public static String divide(String arg1, String arg2, int digit){
        if(isZero(arg1)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal multiplyResult = arg1BigDecimal.divide(arg2BigDecimal, digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * arg1 / arg2
     * @param arg1
     * @param arg2
     * @param digit
     * @return
     */
    public static String divide(String arg1, BigDecimal arg2, int digit){
        if(isZero(arg1)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal multiplyResult = arg1BigDecimal.divide(arg2, digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * arg1 / arg2
     * @param arg1
     * @param arg2
     * @param digit
     * @return
     */
    public static String divide(BigDecimal arg1, String arg2, int digit){
        if(isZero(arg1)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        BigDecimal multiplyResult = arg1.divide(arg2BigDecimal, digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * arg1 / arg2
     * @param arg1
     * @param arg2
     * @param digit
     * @return
     */
    public static String divide(BigDecimal arg1, BigDecimal arg2, int digit){
        if(isZero(arg1)){
            return formatDecimal(BigDecimal.ZERO, digit);
        }
        BigDecimal multiplyResult = arg1.divide(arg2, digit, BigDecimal.ROUND_DOWN);
        return formatDecimal(multiplyResult, digit);
    }

    /**
     * 比较两个数据是否相等
     * @param arg1
     * @param arg2
     * @return
     */
    public static boolean isEquals(String arg1, String arg2){
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        return 0==arg1BigDecimal.compareTo(arg2BigDecimal);
    }

    /**
     * 比较两个数据是否相等
     * @param arg1
     * @param arg2
     * @return
     */
    public static boolean isEquals(String arg1, BigDecimal arg2){
        BigDecimal arg1BigDecimal = stringToBigDecimal(arg1);
        return 0==arg1BigDecimal.compareTo(arg2);
    }

    /**
     * 比较两个数据是否相等
     * @param arg1
     * @param arg2
     * @return
     */
    public static boolean isEquals(BigDecimal arg1, String arg2){
        BigDecimal arg2BigDecimal = stringToBigDecimal(arg2);
        return 0==arg1.compareTo(arg2BigDecimal);
    }

    /**
     * 比较两个数据是否相等
     * @param arg1
     * @param arg2
     * @return
     */
    public static boolean isEquals(BigDecimal arg1, BigDecimal arg2){
        return 0==arg1.compareTo(arg2);
    }
}